package Classes;

import java.util.*;

/**
 * 
 * @author JAVA - LI
 *
 */
public class Usuario{
	
	private String nome = "";
	private ArrayList<Opniao> opnioes;
	private String dataDoCadastro;
	
	/**
	 * Cria um objeto da classe usuario
	 * @param nome Nome do usuario
	 * @param dataDoCadastro Data da realizacao do cadastro
	 * @param opnioes Lista de opinioes do usuario.
	 */
	public Usuario(String nome,String dataDoCadastro,ArrayList<Opniao> opnioes){
		this.nome = nome;
		this.opnioes = opnioes;
		this.dataDoCadastro = dataDoCadastro;
	}
	
	/**
	 * Retorna a data de cadastro do usuario.
	 * @return A data de cadastro do usuario.
	 */
	public String getDataDoCadastro(){
		return dataDoCadastro;
	}
	
	/**
	 * Altera data do cadastro.
	 * @param data A nova data do cadastro.
	 */
	public void setDataDoCadastro(String data){
            this.dataDoCadastro = data;
    }
		
	/**
	 * Retorna o nome do usuario.
	 * @return O nome do usuario.
	 */
	public String getNome(){
		return nome;
	}
	
	/**
	 * Altera o nome do usuario.
	 * @param nome Novo nome do usuario.
	 */
    public void setNome(String nome){
        this.nome = nome;
    }
	
	/**
	 * Retorna a lista de opinioes do usuario.
	 * @return A lista de opinioes do usuario.
	 */
	public ArrayList<Opniao> getPreferencias(){
		return opnioes;
	}
	
	/**
	 * Retorna a opiniao do usuario sobre um determinado restaurante.
	 * @param nomeDoRestaurante O nome do restaurante que deseja saber a opiniao.
	 * @return A opiniao do usuario sobre determinado restaurante.
	 */
	public Opniao getOpniao(String nomeDoRestaurante){
		Iterator<Opniao> interador = opnioes.iterator();
		while(interador.hasNext()){
			Opniao op = interador.next();
			if(nomeDoRestaurante.equals(op.getNomeEstabelecimento())){
				return op;
			}		
		}
		return null;
	}
	
	/**
	 * Retorna true caso estabelecimento dado como parametro estiver na lista de opinioes.
	 * @param nomeDoRestaurante Nome do restaurante a ser analisado.
	 * @return true caso estabelecimento dado como parametro estiver na lista de opinioes. 
	 */
	public boolean getOpniaoBoolean(String nomeDoRestaurante){
		Iterator<Opniao> interador = opnioes.iterator();
		while(interador.hasNext()){
			Opniao op = interador.next();
			if(nomeDoRestaurante.equals(op.getNomeEstabelecimento())){
				return true;
			}		
		}
		return false;
	}
	
	/**
	 * Retorna um boolean, e muda a opiniao do usuario sobre determinado restaurante.
	 * @param restaurante Nome do restaurante que deseja alterar a opiniao.
	 * @param nota Nova nota que deseja relacionar ao restaurante.
	 * @param novoComentario Novo comentario que deseja relacionar ao restaurante.
	 * @return Um boolean, dependendo se a mudanca foi efetuada(true) ou nao(false). 
	 */
	public boolean mudaPreferencia(Opniao opi){
		Iterator<Opniao> interador = opnioes.iterator();
		while(interador.hasNext()){
			Opniao op = interador.next();
			if(opi.getNomeEstabelecimento().equals(op.getNomeEstabelecimento())){
				op.mudaOpniao(opi);
				return true;
			}
		}
                opnioes.add(opi);
		return false;
	}
	
	/**
	 * Retorna um boolean, adicionando uma opiniao do usuario.
	 * @param opniao A opiniao do usuario.
	 * @return true caso o restaurante exista e adicione a opiniao, e false caso a opiniao nao for adicionada.
	 */
	public boolean adicionaPreferencia(Opniao opniao){
			Iterator<Opniao> interador = opnioes.iterator();
			while(interador.hasNext()){
				Opniao op = interador.next();
				if(opniao.getNomeEstabelecimento().equals(op.getNomeEstabelecimento())){
					return false;
				}
			}
			opnioes.add(opniao);
			return true;
	}
	
	/**
	 * Remove uma opiniao sobre determinado restaurante.
	 * @param restaurante Nome do restaurante.
	 */
	public void removePreferencia(String restaurante){
		Iterator<Opniao> interador = opnioes.iterator();
		while(interador.hasNext()){
			Opniao op = interador.next();
			if(restaurante.equals(op.getNomeEstabelecimento())){
				opnioes.remove(op);
			}
		}
	}
	
	
	@Override
	/**
	 * Retorna um inteiro simbolizando o endereco de memoria.
	 */
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((opnioes == null) ? 0 : opnioes.hashCode());
		result = prime * result
				+ ((dataDoCadastro == null) ? 0 : dataDoCadastro.hashCode());
		result = prime * result + ((nome == null) ? 0 : nome.hashCode());
		return result;
	}
	
	@Override
	/**
	 * Retorna um boolean comparando se dois objetos forem iguais.
	 */
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Usuario other = (Usuario) obj;
		if (opnioes == null) {
			if (other.opnioes != null)
				return false;
		} else if (!opnioes.equals(other.opnioes))
			return false;
		if (dataDoCadastro == null) {
			if (other.dataDoCadastro != null)
				return false;
		} else if (!dataDoCadastro.equals(other.dataDoCadastro))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}
	
	@Override
	public String toString() {
		return dataDoCadastro+" "+nome;
	}
}
